import java.util.*;
import java.io.*;

public class Navigation {

    static int n = 195; //点数
    static int m = 500; //边数
    static int mode;    //模式
    static Building curBuilding;    //当前所在建筑
    static HashMap<String, ArrayList<Building>> DevicesMap= new HashMap<>();    //包含每个设施的建筑表
    static ArrayList<Building> resultList = new ArrayList<>();  //每次查询的结果列表
    static {
        System.out.println("********************************************");
        System.out.println(" Designed by GuoShaoting, guost@bupt.edu.cn ");
        System.out.println("      version 6.40          2021.6.10       ");
        System.out.println(" Thanks:  Wang & Chen, for building the map ");
        System.out.println("********************************************");
    }

    public static void main(String[] args) throws IOException {

        Scanner in = new Scanner(System.in);
        int index;  //选择查找列表对应的条目

        fileOutput.cacheSetting();  //初始化日志文件
        Input.InputBuildings(); //初始化建筑与边
        Input.InputEdges();

        int count = 0;  //共进行了几次导航

        while (true) {

            int start, end, restart = 0;

            if (count != 0) {   //不是第一次导航,会有之前的记录
                fileOutput.Cacheln(true, "检测到当前位于" + curBuilding.Building_Name + ", 是否使用当前位置？(0: 使用;1: 重新输入(或退出程序))");
                restart = in.nextInt();
                fileOutput.Cacheln(false, restart);
            }

            fileOutput.Cacheln(true, "输入导航策略：(0为最短距离，1为最短时间，2为自行车导航, 3为周边导航, 4为途经点导航, 5为课表导航, 其他为退出程序)");
            mode = in.nextInt();    //输入模式
            fileOutput.Cacheln(false, mode);
            if (mode >= 6 || mode < 0) break;

            if (count == 0 || restart == 1){    //第一次导航或者需要重新输入, 起点通过输入来确定
                resultList.clear();
                while (resultList.isEmpty()) {
                    fileOutput.Cacheln(true, "输入起点");
                    Search.getStart_End();
                }

                index = in.nextInt();
                while (index < 0 || index >= resultList.size()){
                    fileOutput.Cacheln(true, "输入错误！请重新输入");
                    index = in.nextInt();
                }
                start = resultList.get(index).ID;
                fileOutput.Cacheln(false, index);

            }else start = curBuilding.ID;   //否则起点为当前建筑

            resultList.clear(); //清空列表方便下次查找

            if (mode == 4){ //途经点模式

                while (resultList.isEmpty()) {
                    fileOutput.Cacheln(true, "输入终点");
                    Search.getStart_End();
                }

                index = in.nextInt();
                while (index < 0 || index >= resultList.size()){
                    fileOutput.Cacheln(true, "输入错误！请重新输入");
                    index = in.nextInt();
                }
                end = resultList.get(index).ID;
                fileOutput.Cacheln(false, index);

                dijkstra.multiplePath(start, end);  //调用途经点方法

            } else if (mode == 3) { //周边模式

                dijkstra.Dijkstra(start);

                dijkstra.nearBy(); //调用周边搜索方法

                index = in.nextInt();
                while (index < 0 || index >= resultList.size()){
                    fileOutput.Cacheln(true, "输入错误！请重新输入");
                    index = in.nextInt();
                }
                end = resultList.get(index).ID;
                fileOutput.Cacheln(false, index);

                dijkstra.output(start, end);

            } else if (mode == 5) { //课表搜索模式

                dijkstra.Dijkstra(start);

                end = dijkstra.course();    //调用课表方法寻找终点

                dijkstra.output(start, end);

            } else {    //普通模式

                dijkstra.Dijkstra(start);

                while (resultList.isEmpty()) {
                    fileOutput.Cacheln(true, "输入终点");
                    Search.getStart_End();
                }

                index = in.nextInt();
                while (index < 0 || index >= resultList.size()){
                    fileOutput.Cacheln(true, "输入错误！请重新输入");
                    index = in.nextInt();
                }
                end = resultList.get(index).ID;
                fileOutput.Cacheln(false, index);

                dijkstra.output(start, end);
            }

            count++;

            System.out.println();
        }
        fileOutput.writer.close();
    }
}